package com.br.negocio.dao;

import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.br.negocio.vo.FornecedorServicoVO;

@Service("fornecedorservicoDAO")
public class FornecedorServicoDAO {

	@PersistenceContext
	private EntityManager entityManager;

	@Transactional(propagation = Propagation.REQUIRED)
	public void inserirFornecedorServico(FornecedorServicoVO fornecedorservicoVO) {
		try {
			entityManager.persist(fornecedorservicoVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao inserir fornecedorservico: " + e.getMessage(), e);
		}
	}
	
	@Transactional(propagation = Propagation.REQUIRED)
	public void atualizarFornecedorServico(FornecedorServicoVO fornecedorservicoVO) {
		try {
			entityManager.merge(fornecedorservicoVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao atualizar fornecedorservico: " + e.getMessage(), e);
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public void removerFornecedorServico(FornecedorServicoVO fornecedorservicoVO) {
		try {
			if (!entityManager.contains(fornecedorservicoVO)) {
				fornecedorservicoVO = entityManager.merge(fornecedorservicoVO);
			}
			entityManager.remove(fornecedorservicoVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao remover fornecedorservico: " + e.getMessage(), e);
		}
	}

//	@Transactional(propagation = Propagation.REQUIRED)
//	public FornecedorServicoVO obterFornecedorServico(FornecedorServicoVO fornecedorservicoVO) {
//		try {
//			return entityManager.find(FornecedorServicoVO.class, fornecedorservicoVO.getIdfornecedor(), fornecedorservicoVO.getIdservico());
//		} catch (Exception e) {
//			throw new RuntimeException("Erro ao buscar fornecedorservico: " + e.getMessage(), e);
//		}
//	}

	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public List<FornecedorServicoVO> obterListaFornecedorServico() {
		try {
			List<FornecedorServicoVO> lista = (List<FornecedorServicoVO>) entityManager.createNamedQuery("loadAllFornecedorServico").getResultList();
			if ((lista != null) && (!lista.isEmpty())) {
				return lista;
			} else {
				return Collections.EMPTY_LIST;
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao carregar todos os fornecedorservicos.", e);
		}
	}
	
	@SuppressWarnings("unchecked")
	@Transactional(propagation = Propagation.REQUIRED)
	public boolean validaDuplicado(FornecedorServicoVO fornecedorservicoVO) {
		Query query = entityManager.createNamedQuery("findDuplicatedFornecedorServico");
//		query.setParameter("cod_fornecedor", fornecedorservicoVO.getIdfornecedor());
//		query.setParameter("cod_servico", fornecedorservicoVO.getIdservico());
		List<FornecedorServicoVO> lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

}